/**
 * 初始化 ajax 请求对象
 * @author rxliuli
 */
;(function (axios) {
    const checkPermission = ({
                                 data: {
                                     code,
                                 },
                             }) => {
        if (code === 401) {
            forward("error/401");
            return true
        }
        if (code === 402) {
            location.href = '/system/login'
            return true
        }
        return false
    }
    window.rxajax = {
        /**
         * 发出 get 请求
         * @param {String} url url 链接
         * @param {Object} [params=undefined] url 参数
         * @param {Object} [config={}] 配置项
         * @param {boolean} [isLoad=true] 是否启用遮罩
         * @returns {Promise} 返回异步数据
         */
        async get(url, params, config = {}, isLoad=true) {
            let close = false
            if (isLoad) {
                close = rxPrompt.load()
            }
            // console.log(`弹窗 ${url} 打开了`)
            try {
                // console.log(`数据加载完毕 ${url}`)
                const res = await axios.get(`${url}?${rx.spliceParams(params)}`, config)
                if (checkPermission(res)) {
                    return
                }
                return res
            } catch (err) {
                return await err
            } finally {
                if (close !== false) {
                    close()
                }
                // console.log(`弹窗 ${url} 关闭了`)
            }
        },
        /**
         * post 请求
         *
         * @param {String} url 请求链接
         * @param {Object} [data] 数据对象，可选
         * @param {Object} [config] 配置项
         * @param {'json' | 'form-data'} [config.type='form-data'] 请求参数类型，默认为 form-data
         * @return {Promise<void>} 请求结果
         */
        async post(url, data, config = {}) {
            const close = rxPrompt.load()
            const {headers = {}} = config
            let temp
            if (config.type === 'json') {
                headers['Content-Type'] = 'application/json'
                temp = data
            } else {
                headers['Content-Type'] = 'application/x-www-form-urlencoded'
                temp = data ? rx.objToFormData(data) : {}
            }
            config['headers'] = headers

            try {
                const res = await axios.post(url, temp, config)
                if (checkPermission(res)) {
                    return
                }
                return res
            } catch (err) {
                return err
            } finally {
                close()
            }
        },
        postJson: async (url, data = {}, config = {}) => {
            return rxajax.post(url, data, {
                type: 'json',
                ...config,
            })
        },
        /**
         * 分页查询
         * 这个 {@link #page} 函数实际上只是特化的 {@link #get} 而已
         * 注：这里实际上没有进行异常的判断就直接返回了 Page 对象，所以如果请求错误/code!=200 则需要自行处理
         * @param {String} url 请求的 url
         * @param {Page} [page=new Page()] 分页信息，直接传入 page 进来即可，除了 {@param page.current} 和 {@param page.size} 之外不会发送其他属性
         * @param {Number} [page.current=1] 当前页数，从 1 开始
         * @param {Number} [page.size=10] 一页数据的数量，默认为 10
         * @param {Object} entity={} 实体参数
         * @param {Object} config={} 查询配置
         * @return {Promise<*>} 查询到的分页列表
         */
        async page(url, page = new Page(), entity = {}, config = {}) {
            const {records, current = 1, size = 10, ...other} = page
            const res = await this.get(url, {
                current,
                size,
                ...other,
                ...entity,
            }, config)
            return res.data.data
        },
    }
})(
    axios.create({
        // TODO 生产，使用 300s 的超时时间
        timeout: 3000000,
        headers: {'X-Requested-With': 'XMLHttpRequest'},
    }),
)